/*
******************************************************************************
* @File			: benchmark_with_timer.c
* @Brief		: 使用定时器, 测试嵌入式平台的函数运行速度的代码片段
* @Author		: adqeor
* @Time			: Feb. 17, 2021
* @Version		: 0.2
********************************************************************************
* @ReleaseNotes:
* v0.2, Feb. 17, 2021
* 修改文档, 缩进.
* v0.1, Dec. 20, 2020
* 首次发布, 并建立文档.
********************************************************************************
* @工作原理:
* 配置定时器, 无中断, 无自动重装. 读定时器的计数寄存器获得周期数, 可转换为时间
********************************************************************************
* @应用说明:
* 应自行平衡精度, 测试速度, 测试集尺寸和测试轮数等. 注意定时器溢出问题. 见程序
********************************************************************************
*/
#ifdef BENCHMARK
	
	const uint32_t epoch = 0x7FF;		// 测试轮数
	const uint32_t batch_size = 0x7F;	// 测试集尺寸
	
	
	float32_t pSrc[batch_size];			// 以测试浮点性能为例, 声明测试数据集和存放位置
	float32_t pDst[batch_size];			// 这是因为某些 FPU 指令需要一并传入目标数据
	
	for (uint32_t i = 0; i < batch_size; i++)	// 测试集赋值
	{
		pSrc[i] = (float) i; pSrc[i] /= 100.0f;
	}
	
	printf("\nBatch Size = %d, Epoch = %d\n", batch_size, epoch);
	HAL_TIM_Base_Start(&htim1); // 启动跑分用定时器. 注意防溢出. 不一定是 tim1, 根据实际情况自行修改吧.
	int32_t time;
	
	// 需要对比几个函数就复制几块, 并添加相应代码和说明文字.
	// 使用 do{}while(0) 包裹函数块.

	do
	{
		htim1.Instance->CNT = 0;
		time = htim1.Instance->CNT;
		for (uint32_t round = 0; round < TEST_ROUND; round++)
		{
			// 一轮计算过程
		}
		time = htim1.Instance->CNT - time;
		printf("\t%.2fms\n", (float)time/10);
	} while(0);
	
	puts("Under armcc 6.12 -O0"); // 前提: 已经将 stdio 重定义到串口调试输出
#endif